package gwtool.backend.updater;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

import javax.swing.JFrame;

/**
 * 
 * @author Christian
 * 
 * @since 5.1.1
 * 
 */
public final class UpdateCheck {

	/**
	 * 
	 */
	private static final String UPDATERFILENAME = "autoUpdater.jar";

	/**
	 * 
	 */
	private static File localPath = new File(System.getProperty("user.home") + "/gwtool/");

	/**
	 * 
	 */
	private CommUtilities commUtilities = null;

	/**
	 * 
	 */
	private String md5 = "";

	/**
	 * 
	 */
	private boolean istAusEclipseGestartet = false;

	/**
	 * 
	 */
	private boolean isLoading = true;

	/**
	 * 
	 */
	private boolean istServerOnline = true;

	/**
	 * Der Construcktor startet die Klasse als Thread
	 * 
	 * @param forceUpdate
	 *            force
	 * @param frame
	 *            der main Heldenframe
	 */
	public UpdateCheck(JFrame frame, boolean forceUpdate) {

		commUtilities = new CommUtilities();
		// Dient zum abfangen von fehlern wenn man Eclipse zum starten nutzt
		istAusEclipseGestartet = !commUtilities.getJarPath().isFile();
		if (!UpdaterDownloader.istInstalliert()) {
			UpdaterDownloader dler = new UpdaterDownloader();
			dler.start();
			try {
				dler.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		init();
	}

	/**
	 * 
	 */
	private void init() {

		URL url;
		try {
			url = new URL(commUtilities.getServerUrl() + "index.php?pw=" + URLEncoder.encode(getReleasePw(), "UTF-8"));
			int count = 0;
			while (md5.equals("")) {
				if (count > 2) {
					throw new Exception("Serverfehler");
				}
				Scanner scanner = new Scanner(url.openStream());
				while (scanner.hasNext()) {
					String part = scanner.nextLine();
					if (part.startsWith("MD5=")) {
						md5 = part.substring("MD5=".length(), part.length());
					}
				}
				scanner.close();
				count++;
			}
			isLoading = false;
			if (!istAusEclipseGestartet()) {
				if (istNeueVersionVorhanden()) {
					zeigeUpdateDialog();
				}
			}
		} catch (Exception e) {
			istServerOnline = false;
			// Updateserver wurde nicht gefunden!
			// Hier vereinfacht da es sehr viele verschiedene Exceptions
			// gibt
			System.out.println(e.getMessage());
		}
	}

	private String getReleasePw() {

		return "";
	}

	/**
	 * @return true wenn aus JarFile gestartet und neue Version online
	 */
	public boolean istNeueVersionVorhanden() {

		String localMd5 = commUtilities.checkDateiMd5(commUtilities.getJarPath());
		return !localMd5.equals(md5);
	}

	/**
	 * 
	 */
	public void zeigeUpdateDialog() {

		startAutoUpdater();
	}

	/**
	 *
	 */
	private void startAutoUpdater() {

		StringBuilder exceBuilder = new StringBuilder();
		exceBuilder.append("java");
		exceBuilder.append(" ");
		exceBuilder.append("-jar");
		exceBuilder.append(" ");
		exceBuilder.append(getUpdaterfilename());
		exceBuilder.append(" ");
		try {
			exceBuilder.append("-jHeldenJar=" + URLEncoder.encode(commUtilities.getJarPath().getAbsolutePath(), "UTF-8"));
		} catch (UnsupportedEncodingException e2) {
			e2.printStackTrace();
			// Darf nicht passieren
		}
		exceBuilder.append(" ");
		exceBuilder.append("-jChannelPw=");
		try {
			exceBuilder.append(URLEncoder.encode(getReleasePw(), "UTF-8"));
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace(); // Darf nicht passieren
		}
		// Helden starten
		try {
			@SuppressWarnings("unused")
			Process proc = Runtime.getRuntime().exec(exceBuilder.toString(), null, localPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.exit(0);
	}

	/**
	 * 
	 * @return true wenn Eclipse
	 */
	public boolean istAusEclipseGestartet() {

		return istAusEclipseGestartet;
	}

	/**
	 * @return true wenn noch der Onlinestatus geladen wird.
	 */
	public boolean isLoading() {

		return isLoading;
	}

	/**
	 * 
	 * @return true wenn die infos geladen wurden
	 */
	public boolean istServerOnline() {

		return istServerOnline;
	}

	/**
	 * 
	 * @return
	 */
	public static String getUpdaterfilename() {

		return UPDATERFILENAME;
	}

	public static boolean isWebstartApp() {

		String value = System.getProperty("jnlpx.home");
		boolean jnlpApiExists;
		try {
			Class.forName("javax.jnlp.BasicService");
			jnlpApiExists = true;
		} catch (ClassNotFoundException p_ex) {
			jnlpApiExists = false;
		}
		return value != null && jnlpApiExists;
	}
}
